Trong Elixir, các tiến trình mặc định là ngắn hạn; khi một hàm kết thúc, tiến trình sẽ ngừng hoạt động. Để tạo ra một tiến trình bền vững, có trạng thái, ta sử dụng đệ quy để giữ cho tiến trình tiếp tục hoạt động trong một vòng lặp.
1. Tối ưu hóa Gọi đuôi (TCO)
Nếu hành động cuối cùng tuyệt đối của một hàm là gọi lại chính nó, máy ảo Erlang (BEAM) sẽ thực hiện Tối ưu hóa Gọi đuôi. Thay vì thêm một khung mới vào ngăn xếp, nó chỉ đơn giản là nhảy trở lại đầu của hàm với các tham số mới.
def factorial(n, acc), do: _fact(n-1, acc*n) # TCO
def factorial(n), do: n * factorial(n-1) # KHÔNG phải TCO
def factorial(n), do: n * factorial(n-1) # KHÔNG phải TCO
2. Trạng thái bền vững
Trạng thái được duy trì bằng cách truyền các giá trị đã cập nhật làm tham số cho lời gọi đệ quy. Nhờ TCO, các tham số này thay thế các tham số ban đầu trên ngăn xếp mà không tiêu tốn thêm bộ nhớ, cho phép các vòng lặp chạy vô hạn.
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>